package com.ls.exception;

import com.alibaba.fastjson.JSON;
import com.ls.utils.ResResult;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 *  统一异常：有错误统一返回状态码300
 *  将结果以json方式返回给前端
 /*
 */
//@ControllerAdvice
public class CommonException {
    /*
      对主要的异常进行判断，抛出对应的错误
      1、这里有两种返回结果：ModelAndView(跳转的页面)
      2、信息提示结果   ResResult(使用输出流输出)
     */
    @ExceptionHandler(RuntimeException.class)
    public ModelAndView handlerException(Exception e,HttpServletResponse response){
        //判断如果是没有登录的异常，则跳到登录页面
        if(e instanceof NoLoginException){
            ModelAndView mv = new ModelAndView("redirect:/login");
            return mv;
        }

        // 设置响应类型及编码格式（响应JSON格式的数据）
        response.setContentType("application/json;charset=UTF-8");
        // 得到输出流
        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        //默认给个错误提示，后面根据不同的异常设置不同的信息
        ResResult res= new ResResult(300,"异常信息,请检查!");
        //将异常信息进行细分判断
        if(e instanceof NullPointerException){
            res= new ResResult("对象未实例化,请检查");
        }
        // 将需要返回的对象转换成JOSN格式的字符
        String json = JSON.toJSONString(res);
        // 输出数据
        out.write(json);
        return  null;
    }
}
